<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>bug汇总</title>
</head>
<body>
<script>
    let obj = {
        age: 20,
        /*如果own对象要指代obj的话不能写this因为this一般在函数里面使用这样才知道当前调用者是谁
        * 也不能写obj 因为这里的等于号是赋值运算符，会先计算右边此时own：访问obj的话，obj还没有创建完成会报错
        * */

        /*
        * 注意this一般只会在函数和class中使用(class本质也是函数) 也就是说使用this要注意当前的作用域
        * 不会在对象中使用this
        * let obj ={
        *   age:12,
        *   getAge(){
        *     log(this.age)
        * },
        *
        *  a:this
        *   }
        * 本质上是
        *   let obj = new Object()
        *   obj.age =12
        *   obj.getAge = function (){
        *     return this.age
        * }
        *   obj.a =this //window
        *
        *
        *
        * */
        // own:this

        //如果想访问当前对象的话可以使用这种方式 表面上看起来是访问属性，其实是在调用函数
        //但不应该这样操作 因为可能会造成属性的死循环
        get owm() {
            return this
        }
    }

    console.log(obj.owm)

    let obj1 = {
        age: 21,
        tell() {
            /*这里之所以可以通过this访问到当前对象是因为函数通过对象去调用的*/
            console.log(this.age)
        }
    }


    /*可以将函数绑定在undefined身上执行*/
    function foo() {
        console.log(1)
    }

    foo.apply(undefined)

    console.log("------------------")


    let name = 1
    obj1 = {
        /*
        * 而且这里的name并不是定义在这里的,而是定义在obj1身上,这样只是简写形式而已
        * */
        name: 'Alice',
        getName() {
            /*
            * 这里如果直接返回name的话会沿着作用域链去寻找name属性 找变量是沿着作用域链去寻找的(函数作用域)
            * 因为是在对象中,在作用域链中只有函数作用域 这里是对象 所以他不会找obj1中定义的name
            * 而是去全局环境中寻找name
            *
            *
               function f() {
                 let name =1
                  console.log(name)//这是在函数中所以会沿着作用域链现在当前作用域中找，当前作用域找不到的话就会去上一级作用域中找
                }
            * */
            return name
        }
    }

    console.log(obj1.getName())

    console.log("------------------")

    /*
    *下面的target是一个对象我们就不能直接 let target 必须要创建一个空对象
    * 因为直接声明一个变量,那么这个变量就是undefined 而我们需要的是一个对象
    * */
    let target = {}
    Object.defineProperties(target, Object.getOwnPropertyDescriptors(obj))


    function f() {

        console.log(f)
    }

    // f.age = 13

    console.log(f.age)


    let fun = function fn() {
        fn.age = 14
        console.log(fn.age)
    }

    fun()
    console.log(fun.age)
</script>
</body>
</html>